SupervisordによるAirFlow動作管理を検証すべくDockerによる環境を整えてみた
はじめに
ワークフロー管理用アプリケーションのAirFlowは、ワークフロー設定更新の即時反映に再起動を行うという選択肢があります。
ただ、明確な特定の再起動手段は存在しないようです。手を掛けずにブラウザ上でステータスを見れて、かつ手軽なデーモン化を検討した結果、supervisordの併用を試してみることにしました。
SupervisordのDockerイメージ設定
当初は puckel/docker-airflow にて検証していましたが、airflowユーザのみドキュメント化されていることもあり、docker exec
にてrootユーザとして入れる klokantech/supervisord-docker にAirFlowを導入するアプローチを取りました。
dockerイメージのセットアップ
設計について見切り発車だったため、この時点ではport設定をしていません。
docker pull khoerintus/supervisord docker run --name supervisord khoerintus/supervisord docker exec -it supervisord /bin/bash
必要なライブラリの導入
動作及び手順に必要なライブラリを導入します。
apt-get install mysql-server build-essential autoconf \ libtool pkg-config python-opengl python-imaging \ python-pyrex python-pyside.qtopengl idle-python2.7 \ qt4-dev-tools qt4-designer libqtgui4 libqtcore4 libqt4-xml \ libqt4-test libqt4-script libqt4-network libqt4-dbus \ python-qt4 python-qt4-gl libgle3 python-dev libmysqlclient-dev wget
MySQLリポジトリの更新
まずは、mysqlのバージョンを最新のものにするため、Oracleからaptリポジトリ設定用debファイルをダウンロードして設定します。
mysql-5.7への更新を選択します。
dpkg -i mysql-apt-config_w.x.y-z_all.deb apt-get update
今回はとにかく動かすことが目的のため、パスワード等を忘れにくい設定で入れておきます。
/etc/init.d/mysqld start /usr/bin/mysqladmin -u root password 'password' /usr/bin/mysql_secure_installation
MySQLの設定変更
初期設定では正常動作しないため、以下2点について変更を入れます。
- sql_mode
- explicit_defaults_for_timestamp
sql_modeは以下の手順で確認します。
mysql -uroot -ppassword -e"select @@sql_mode"
確認したsql_modeからSTRICT_TRANS_TABLESを除いた値を設定します。
% vim /etc/mysql/mysql.conf.d/mysqld.cnf [mysqld] explicit_defaults_for_timestamp = 1 sql_mode=...
STRICT_TRANS_TABLESに関する扱いについては以下の記事を参照してください。
AirFlowのインストール
pipを導入します。
curl -kL https://bootstrap.pypa.io/get-pip.py | python pip install apache-airflow[mysql] mysql-python airflow initdb
MySQLを参照するように設定を変更します。
% vim /root/airflow/airflow.cfg [mysqld] sql_alchemy_conn = mysql://root:password@localhost:3306/airflow
初期DBを追加します。
mysql -uroot -ppassword -e "CREATE DATABASE IF NOT EXISTS airflow CHARACTER SET utf8;"
再度AirFlowの初期設定を行います。
airflow resetdb airflow initdb
Supervisordでの管理設定
airflow用の設定ファイルを追加します。
% vim /etc/supervisor/conf.d/airflow.conf ; Configuration for Airflow webserver and scheduler in Supervisor [program:airflow] command=/usr/local/bin/airflow webserver stopsignal=QUIT stopasgroup=true user=root stdout_logfile=/var/log/airflow/airflow-stdout.log stderr_logfile=/var/log/airflow/airflow-stderr.log environment=HOME="/home/airflow",AIRFLOW_HOME="/root/airflow",TMPDIR="/storage/airflow_tmp" [program:airflowscheduler] command=/usr/local/bin/airflow scheduler stopsignal=QUIT stopasgroup=true killasgroup=true user=root stdout_logfile=/var/log/airflow/airflow-scheduler-stdout.log stderr_logfile=/var/log/airflow/airflow-scheduler-stderr.log environment=HOME="/home/airflow",AIRFLOW_HOME="/root/airflow",TMPDIR="/storage/airflow_tmp" autorestart=true
Supervisord 経由での起動
supervisordにて動作設定を反映します。
supervisorctl reread supervisorctl add airflow supervisorctl add airflowscheduler supervisorctl start airflow supervisorctl start airflowscheduler
まとめ
Supervisord用のコンテナイメージ内ライブラリが想定よりも不足していたり古かったりと、コンテナそのものの更新に色々手間取った形になりました。
今回はSupervisordを通してAirFlowの動作を制御することが目的でしたが、AirFlowの初期設定にて躓いた際の参考にもなれれば幸いです。